/*
 * @Author: 13177709051 3506463075@qq.com
 * @Date: 2024-10-29 00:05:27
 * @LastEditors: 13177709051 3506463075@qq.com
 * @LastEditTime: 2024-10-29 00:31:46
 * @FilePath: /linux25/text.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
// 线程通常共享同一进程的内存空间，因此当线程切换时，许多数据和代码仍然在缓存中。这种共享提高了缓存的命中率，减少了从主内存读取数据的需要。
// 进程切换通常涉及更改整个进程的地址空间。当一个进程切换到另一个进程时，原有的缓存数据往往会被新的进程的缓存替换，这导致了缓存失效（cache misses）。这意味着需要更多的时间去重新加载所需的数据。


// 并发执行：

// 线程允许程序在同一进程中同时执行多个任务，提高程序的并发性和响应速度。例如，用户界面线程可以与后台处理线程并行工作，保持应用程序的响应性。
// 资源共享：

// 线程在同一进程中共享内存和资源，这使得数据共享更加高效。线程之间的通信和数据传递相比进程间通信（IPC）更简单，减少了数据复制和上下文切换的开销。
// 提高性能：

// 在多核处理器上，多个线程可以并行执行，从而充分利用多核的计算能力，提高应用程序的性能。例如，图像处理、数据分析等任务可以通过多线程加速处理。
// 异步操作：

// 线程可以用于实现异步操作，使得程序在等待某些耗时操作（如I/O操作、网络请求）时不会阻塞主执行流。例如，网络下载可以在一个线程中进行，主线程仍然可以处理用户输入。
// 后台处理：

// 线程适合执行需要长时间处理的任务，而不影响主程序的性能。例如，定期执行的任务（如日志记录、数据备份）可以在后台线程中运行。
// 简化设计：

// 在某些应用中，使用线程可以使程序设计更为简单清晰。比如，使用线程池可以管理多个任务并减少资源的管理复杂性。
// 游戏和图形处理：

// 在游戏开发中，多个线程可用于处理物理运算、图形渲染和AI计算，使游戏更加流畅和高效。
// 服务器应用：

// 在服务器应用中，线程可以用于处理多个并发请求，例如Web服务器通常会为每个请求创建一个线程，以提高处理能力和响应速度。


#include <iostream>
#include <unistd.h>
#include <ctime>

int gval = 100;


void *threadStart(void *args)
{
    while(true)
    {
        sleep(1);
        int x = rand() % 5;
        std::cout << "new thread running..." << "pid: " << getpid() << ", gval: " << gval << ", &gal: " << &gval << std::endl;

        if(x == 0)
        {
            int *p = nullptr;
            *p = 100;//野指针
        }
    }
} 

int main()
{
    srand(time(nullptr));

    pthread_t tid1;
    pthread_create(&tid1, nullptr, threadStart, (void *)"thread-new");

    pthread_t tid2;
    pthread_create(&tid2, nullptr, threadStart, (void *)"thread-new");
    
    pthread_t tid3;
    pthread_create(&tid3, nullptr, threadStart, (void *)"thread-new");

    pthread_t tid4;
    pthread_create(&tid4, nullptr, threadStart, (void *)"thread-new");


    //主线程
    while(true)
    {
        std::cout << "main thread running..." << ", pid: " << getpid() << ", gval: " << gval << ", &gval: " << &gval << std::endl;
        gval++;
        sleep(1);
    }
}